﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Objects.DataClasses;

namespace ChampionFramework.Models
{
    public abstract partial class Jogo : EntityObject
    {
        public Escalacao GetEscalacaoMandante()
        {
            return this.Escalacao.Single(e => e.Mandante);
        }

        public Escalacao GetEscalacaoVisitante()
        {
            return this.Escalacao.Single(e => !e.Mandante);
        }

        public bool Iniciado()
        {
            return (this.GetEtapaAtual() != null || this.Encerrado);
        }

        public Etapa GetEtapaAtual()
        {
            if (this.Etapa.Where(e => e.Atual).Count() > 0)
                return this.Etapa.Single(e => e.Atual);
            return null;
        }

        public void Iniciar(ChampionContextContainer db)
        {
            EtapaRegulamentar e = new EtapaRegulamentar
            {
                Atual = true,
                Encerrada = false,
                Jogo = this,
                PrimeiroTempo = true,
                Iniciada = false
            };
            this.Etapa.Add(e);
            db.ObjectStateManager.ChangeObjectState(this, System.Data.EntityState.Modified);
            db.SaveChanges();
        }

        public void IniciarEtapaAtual(ChampionContextContainer db)
        {
            this.GetEtapaAtual().Iniciar(db);
        }

        public void EncerrarEtapaAtual(ChampionContextContainer db)
        {
            this.GetEtapaAtual().Encerrar(db);
        }

        public int[] GetPlacar()
        {
            int mandante = 0;
            int visitante = 0;
            foreach (var etapa in this.Etapa)
            {
                foreach (var gol in etapa.Evento.OfType<Gol>())
                {
                    if (gol.Jogador.TimeId == this.GetEscalacaoMandante().TimeId && !gol.Contra)
                        ++mandante;
                    else if (gol.Jogador.TimeId == this.GetEscalacaoMandante().TimeId && gol.Contra)
                        ++visitante;
                    else if (gol.Jogador.TimeId == this.GetEscalacaoVisitante().TimeId && !gol.Contra)
                        ++visitante;
                    else if (gol.Jogador.TimeId == this.GetEscalacaoVisitante().TimeId && gol.Contra)
                        ++mandante;
                }
            }
            return new int[] { mandante, visitante };
        }

        public abstract void EncerrarJogoRegulamentar();
    }
}